This example mirrors mesh.curv.html.
In [1]:
from pathlib import Path
from ipyniivue import download_dataset
# 1. Download
# Matcaps
BASE_API_URL = "https://niivue.com/demos/"
MATCAPS_DATA_FOLDER = Path("matcaps")
download_dataset(
api_url=BASE_API_URL + "matcaps",
dest_folder=MATCAPS_DATA_FOLDER,
files=[
"Shiny.jpg",
"Cortex.jpg",
"Cream.jpg",
"Fuzzy.jpg",
"Peach.jpg",
"Plastic.jpg",
"Gold.jpg",
],
)
# Images
IMAGES_DATA_FOLDER = Path("images")
download_dataset(
api_url=BASE_API_URL + "images",
dest_folder=IMAGES_DATA_FOLDER,
files=[
"fs_LR.32k.LR.curvature.dscalar.nii",
"fs_LR.32k.L.inflated.surf.gii",
],
)
Downloading Shiny.jpg... Downloading Cortex.jpg...
Downloading Cream.jpg... Downloading Fuzzy.jpg...
Downloading Peach.jpg... Downloading Plastic.jpg...
Downloading Gold.jpg... Dataset downloaded successfully to matcaps. Downloading fs_LR.32k.LR.curvature.dscalar.nii... Downloading fs_LR.32k.L.inflated.surf.gii...
Dataset downloaded successfully to images.
In [2]:
import ipywidgets as widgets
import ipyniivue
# 2. Initialize NiiVue
nv = ipyniivue.NiiVue()
nv.opts.loading_text = "there are no images"
nv.opts.back_color = [1, 1, 1, 1]
nv.opts.show_3d_crosshair = True
# 3. UI Controls
# Slider for opacity (Curve)
opacity_slider = widgets.FloatSlider(
min=0, max=1.0, value=222 / 255, description="Curve", continuous_update=True
)
# Checkbox for HighDPI
high_dpi_check = widgets.Checkbox(value=False, description="HighDPI")
# Dropdown for MatCaps
matcap_names = ["Shiny", "Cortex", "Cream", "Fuzzy", "Peach", "Plastic"]
matcap_dropdown = widgets.Dropdown(
options=matcap_names, value="Shiny", description="MatCap"
)
# Dropdown for Shaders
shader_names = nv.mesh_shader_names()
shader_dropdown = widgets.Dropdown(
options=shader_names, value="Matcap", description="Shaders"
)
# 4. Callbacks
def on_opacity_change(change):
"""Handle opacity change."""
if nv.meshes:
nv.set_mesh_layer_property(nv.meshes[0].id, 0, "opacity", change["new"])
def on_high_dpi_change(change):
"""Handle dpi change."""
nv.set_high_resolution_capable(bool(change["new"]))
def on_matcap_change(change):
"""Handle matcap change."""
if nv.meshes:
nv.set_mesh_shader(nv.meshes[0].id, "Matcap")
shader_dropdown.value = "Matcap"
name = change["new"]
matcap_path = MATCAPS_DATA_FOLDER / f"{name}.jpg"
with open(matcap_path, "rb") as f:
matcap_data = f.read()
nv.load_mat_cap_texture(matcap_data)
def on_shader_change(change):
"""Handle shader change."""
if nv.meshes:
nv.set_mesh_shader(nv.meshes[0].id, change["new"])
# Attach handlers
opacity_slider.observe(on_opacity_change, names="value")
high_dpi_check.observe(on_high_dpi_change, names="value")
matcap_dropdown.observe(on_matcap_change, names="value")
shader_dropdown.observe(on_shader_change, names="value")
# 5. Data Loading
mesh_layer = {
"path": IMAGES_DATA_FOLDER / "fs_LR.32k.LR.curvature.dscalar.nii",
"colormap": "gray",
"cal_min": -0.15,
"cal_max": -0.001,
"opacity": 222 / 255,
}
nv.load_meshes(
[
{
"path": IMAGES_DATA_FOLDER / "fs_LR.32k.L.inflated.surf.gii",
"layers": [mesh_layer],
}
]
)
# 6. Initialize State
on_matcap_change({"new": "Shiny"})
# 6. Display All
header = widgets.HBox([opacity_slider, high_dpi_check])
footer = widgets.HBox([shader_dropdown, matcap_dropdown])
widgets.VBox([header, nv, footer])
Out[2]: